home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Turnbull China Bikeride
/
Turnbull China Bikeride - Disc 2.iso
/
STUTTGART
/
LANG
/
C
/
LIB
/
UNIXLIB37B
/
!UnixLib37
/
src
/
signal
/
c
/
sigprocmsk
< prev
next >
Wrap
Text File
|
1996-11-09
|
2KB
|
84 lines
/****************************************************************************
*
* $Source: /unixb/home/unixlib/source/unixlib37/src/signal/c/RCS/sigprocmsk,v $
* $Date: 1996/10/30 22:04:51 $
* $Revision: 1.1 $
* $State: Rel $
* $Author: unixlib $
*
* $Log: sigprocmsk,v $
* Revision 1.1 1996/10/30 22:04:51 unixlib
* Initial revision
*
***************************************************************************/
static const char rcs_id[] = "$Id: sigprocmsk,v 1.1 1996/10/30 22:04:51 unixlib Rel $";
/* signal.c.sigprocmsk: Implementation of the POSIX signal function
sigprocmask.
Written by Nick Burrett, 5 October 1996. */
#include <errno.h>
#include <signal.h>
#include <sys/unix.h>
/* If SET is not NULL, modify the current set of blocked signals
according to HOW, which may be SIG_BLOCK, SIG_UNBLOCK or SIG_SETMASK.
If OSET is not NULL, store the old set of blocked signals in *OSET.
If invoking sigprocmask causes any pending signals to be unblocked,
at least one of those signals will be delivered to the process
before sigprocmask returns. The order in which pending signals
are delivered is not specified. */
int sigprocmask (int how, const sigset_t *nset, sigset_t *oset)
{
unsigned int mask;
sigset_t set;
if (oset != NULL)
*oset = __u->sigstate.blocked;
if (nset == NULL)
return 0;
set = *nset;
/* Don't block SIGKILL or SIGSTOP. */
if (sigismember (&set, SIGKILL))
sigdelset (&set, SIGKILL);
if (sigismember (&set, SIGSTOP))
sigdelset (&set, SIGSTOP);
mask = (unsigned int)set;
if (how == SIG_BLOCK)
{
/* This will always block more signals,
so we don't have to worry about delivering
pending signals. */
__u->sigstate.blocked &= mask;
}
else if (how == SIG_UNBLOCK)
{
__u->sigstate.blocked &= ~mask;
/* Cause delivery of some pending signals. */
__unixlib_raise_signal (0, 0, 0, 0);
}
else if (how == SIG_SETMASK)
{
__u->sigstate.blocked = mask;
/* The new mask might have unblocked a few signals so try and
deliver the pending ones. */
__unixlib_raise_signal (0, 0, 0, 0);
}
else
{
errno = EINVAL;
return -1;
}
return 0;
}